2023 MathorCup C题解析思路+代码

您所在的位置:网站首页 开拓者源码 解析 2023 MathorCup C题解析思路+代码

2023 MathorCup C题解析思路+代码

2023-04-15 13:03| 来源: 网络整理| 查看: 265

问题重述

给定一电商物流网络,该网络由物流场地和运输线路组成,各场地和线路之间的货量随时间变化。现需要预测该网络在未来每天的各物流场地和线路的货量,以便管理者能够提前安排运输和分拣等计划,降低运营成本,提高运营效率。此外,还需要设计物流网络调整方案,以应对突发事件导致场地停用的情况。假设每个物流场地的处理能力和每条线路的运输能力上限均为其历史货量最大值

注:因为C题言简意赅且比较传统,可以预计的是选择C题人数会较多问题一

建立线路货量的预测模型,对 2023-01-01 至 2023-01-31 期间每条线路每天的货量进行预测,并在提交的论文中给出线路 DC14→DC10、DC20→DC35、DC25→DC62 的预测结果。

建立线路货量的预测模型的步骤如下:

数据预处理:对于每条线路和每个物流场地,计算其历史货量的平均值、方差等统计量,并进行缺失值填充。特征工程:根据历史货量的时间序列数据,提取相关特征,如趋势、周期性、节假日影响等。模型选择:选择适合时间序列预测的模型,如 ARIMA、SARIMA、Prophet 等。模型训练:使用历史数据训练模型,并根据模型的性能对模型进行调优。模型预测:对于每条线路和每个物流场地,使用训练好的模型进行预测,并计算预测结果的置信区间。数据进行预处理

可以看到附件1中部分数学出现缺失或为零,为了处理缺失的数据,典型的方法包括插值法删除法, 其中插值法用一个替代值弥补缺失值,而删除法则直接忽略缺失值。

注:因为此题数据众多,我们强烈推荐使用Python进行数据处理(当然Matlab也可以)

Python代码

import pandas as pd # python的第三方库 data = pd.read_csv(data_file) # 修改为文件目录 ​ inputs = data.iloc[:] # 使用平均进行插值(均是数值缺失) inputs = inputs.fillna(inputs.mean()) print(inputs) ​ # 也可以删除缺失行 n, m = data.shape for i in range(m): for j in range(n): if pd.isnull(data.iloc[j][i]): data.drop(j) break ​ 将数据转换为 stationary 数据

首先需要对数据进行预处理,将附件一中的货量数据按照每条线路每天的形式进行整理,并将时间序列数据转换为 stationary 数据,以便进行时间序列建模。代码如下:

import pandas as pd import numpy as np import matplotlib.pyplot as plt from statsmodels.tsa.stattools import adfuller from statsmodels.graphics.tsaplots import plot_acf, plot_pacf from statsmodels.tsa.arima.model import ARIMA # 读取数据 df = pd.read_csv('附件一.csv', header=None, names=['source', 'target', 'date', 'quantity']) # 按照每条线路每天的形式整理数据 df['date'] = pd.to_datetime(df['date']) df = df.groupby(['date', 'source', 'target'])['quantity'].sum().reset_index() # 将数据转换为 stationary 数据 for line in df.groupby(['source', 'target']): line_name = line[0] line_data = line[1]['quantity'] dftest = adfuller(line_data, autolag='AIC') if dftest[1] > 0.05: df[f'{line_name[0]}_{line_name[1]}_diff'] = np.nan df[f'{line_name[0]}_{line_name[1]}_diff'][1:] = line_data.diff()[1:] else: df[f'{line_name[0]}_{line_name[1]}_diff'] = line_data

然后,对于每条线路,可以使用 ACF 和 PACF 图形来确定 ARIMA 模型的 p、q 值。代码如下:

# 确定 ARIMA 模型的 p、q 值 line_name = ('DC14', 'DC10') line_data = df[f'{line_name[0]}_{line_name[1]}_diff'] plot_acf(line_data, lags=30) plt.show() plot_pacf(line_data, lags=30) plt.show()

通过观察 ACF 和 PACF 图形,可以看出该线路的数据具有季节性,因此需要进行季节性差分。代码如下:

# 进行季节性差分 line_diff = line_data.diff(7).dropna() plot_acf(line_diff, lags=30) plt.show() plot_pacf(line_diff, lags=30) plt.show()

最后,可以使用确定好的 p、q 值和季节性差分后的数据,训练 ARIMA 模型并进行预测。代码如下:

# 训练 ARIMA 模型并进行预测 model = ARIMA(line_data, order=(2, 1, 2), seasonal_order=(1, 1, 1, 7)) model_fit = model.fit() pred = model_fit.predict(start='2023-01-01', end='2023-01-31', dynamic=True) print(pred)

更多的细节详见这里呀:2023 MathorCup C题解析思路+代码 (mbd.pub)



【本文地址】


今日新闻


推荐新闻


CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3